package main

import "fmt"
import "strconv"

//通过Comma-ok断言判断interface型变量具体保存了哪个类型的变量

type Element interface{} //定义空接口，可保存任意类型
type List []Element      //Element切片

type Person struct {
	name string
	age  int
}

//定义String方法，实现了fmt.Stringer
func (p Person) String() string {
	return "{name:" + p.name + ",age:" + strconv.Itoa(p.age) + "}"
}

func main() {
	list := make(List, 3)
	list[0], list[1], list[2] = 1, "Hello", Person{"Dennis", 70}

	//if语句实现
	for i, e := range list {
		if val, ok := e.(int); ok { //判断e是否为int型
			fmt.Printf("list[%d]为int型值为%d\n", i, val)
		} else if val, ok := e.(string); ok { //判断e是否为string型
			fmt.Printf("list[%d]为string型值为%s\n", i, val)
		} else if val, ok := e.(Person); ok { //判断e是否为Person型
			fmt.Printf("list[%d]为Person型值为%s\n", i, val)
		} else {
			fmt.Printf("list[%d]是一个未知类型\n", i)
		}
	}

	//switch语句实现
	for i, e := range list {
		switch val := e.(type) { //注意：e.(type)只能用在switch语句中
		case int:
			fmt.Printf("list[%d]为int型值为%d\n", i, val)
		case string:
			fmt.Printf("list[%d]为string型值为%s\n", i, val)
		case Person:
			fmt.Printf("list[%d]为Person型值为%s\n", i, val)
		default:
			fmt.Printf("list[%d]是一个未知类型\n", i)
		}
	}
}
